#include <QDebug>
#include "canThread.h"
#include "KgGlobalData.h"
#include <QSettings>

CanThread::CanThread(QObject *parent, CRTDB *pRTDB, int bcIndex): QThread(parent),m_pRTDB(pRTDB),m_bcIndex(bcIndex)
{
    m_strLog = QString("../log/CAN-%1.log").arg(m_bcIndex);
    devConfig();  
    KG_LOG_INFO(QString("VER1.0 RTDB%1.%2.%3").arg(BAMS_VERSION_MAJOR).arg(BAMS_VERSION_MINOR).arg(BAMS_VERSION_REVISION));
    m_bOpen = 0;
    m_pRecv = new char[sizeof(SCanMutiFrame)*100];
    m_ReInit = QDateTime::currentDateTime();
    m_pBattStack = m_pRTDB->getStack(0); 
}

CanThread::~CanThread()
{}

void CanThread::run()
{
    while(1)
    {
        if (!m_bOpen)
        {
            m_bOpen = canInit();
            msleep(200);
        }
        msleep(10);
        readBmsData();
        readThData();
        readHkData();
    }
}

void CanThread::readBmsData(void)
{
    for (int index=0; index<m_bmsDevCount; index++)
    {
        devData &dev = m_bmsList[index];
        switch(dev.m_uFunc)
        {
            case 3010: funcBms3010(dev, index); break; //【科工】【BMS与PCS的通讯协议】
            case 3020: funcBms3020(dev, index); break; //【团标】【中国化学与物理电源行业协会团体标准公告】
            case 3100: funcBms3100(dev, index); break; //【索英】【储能变流器与电池监控系统通信协议V1.0】
            case 3101: funcBms3101(dev, index); break; //【索英】【储能变流器与电池监控系统通信协议V1.6】
            case 3150: funcBms3150(dev, index); break; //【禾望】【PCS与BMS的CAN通信规约】
            case 3160: funcBms3160(dev, index); break; //【协能】【储能PCS与BMS-CAN通信协议】
        }    
        m_bOpen = !dev.m_uCommState;
        if (dev.m_uCommLastState != dev.m_uCommState)
        {
            if ((dev.m_Time.secsTo(QDateTime::currentDateTime()) >= dev.m_uCommTimeout) || (dev.m_uCommState == 0))
            {
                dev.m_Time = QDateTime::currentDateTime();
                dev.m_uCommLastState = dev.m_uCommState;
                // ? = dev.m_uCommState;
                QString str = QString("连接逆变器%1 BMS通信%2").arg(index+1).arg(dev.m_uCommState?"失败":"成功");
                KG_LOG_INFO(str);
                saveLogToBaDb(str);  
            }    
        }
        else
        {
            dev.m_Time = QDateTime::currentDateTime();
        }
    }
}

void CanThread::funcBms3010(devData &dev, int index) //【科工】【BMS与PCS的通讯协议】
{
    dev.m_uCommState = 0;
    if (m_ReInit.secsTo(QDateTime::currentDateTime()) >= 5)
    {
        m_ReInit = QDateTime::currentDateTime();
        m_bOpen = canInit();
        msleep(200);
    }       
    if (m_pBattStack->usDCSideConfType == 0) // 并连汇入
    {
        // 堆状态
        addToBuff(&a[0], swapBytes(m_pBattStack->usStackState));
        // 最大允许充电电流 0.1
        addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fStackAllowMaxChargeCurrent*10)));
        // 最大允许放电电流 0.1
        addToBuff(&a[4], swapBytes((quint16)(m_pBattStack->fStackAllowMaxDischargeCurrent*10)));
        // SOC 0.1
        addToBuff(&a[6], swapBytes((quint16)(m_pBattStack->fStackSoc*10)));
        // 发送
        canSendFrame(0x1801F080, 8, a, true);
        QString str = QString(" 堆状态=%1").arg(m_pBattStack->usStackState,0,16).toUpper();
        str += QString(" 最大允许充电电流=%1").arg(m_pBattStack->fStackAllowMaxChargeCurrent);                            
        str += QString(" 最大允许放电电流=%1").arg(m_pBattStack->fStackAllowMaxDischargeCurrent);
        str += QString(" SOC=%1").arg(m_pBattStack->fStackSoc);
        KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
        msleep(dev.m_uDelayMs);

        // 可充电量 0.1
        addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fStackChargeEQ*10)));
        // 可放电量 0.1
        addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fStackDischargeEQ*10)));
        // 总电压 0.1
        addToBuff(&a[4], swapBytes((quint16)(m_pBattStack->fStackVol*10)));
        // 总电流 0.1
        addToBuff(&a[6], swapBytes((quint16)((signed short)(-m_pBattStack->fStackCur*10))));
        // 发送
        canSendFrame(0x1802F080, 8, a, true);
        str = QString(" 可充电量=%1").arg(m_pBattStack->fStackChargeEQ);
        str += QString(" 可放电量=%1").arg(m_pBattStack->fStackDischargeEQ);                            
        str += QString(" 总电压=%1").arg(m_pBattStack->fStackVol);
        str += QString(" 总电流=%1").arg(m_pBattStack->fStackCur);
        KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
        msleep(dev.m_uDelayMs);

        // 最大SOC 0.1
        addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fBankSocMax*10)));
        // 最小SOC 0.1
        addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fBankSocMin*10)));
        // 最大电压 0.001
        addToBuff(&a[4], swapBytes((quint16)(m_pBattStack->fSglMaxVolInStack*1000)));
        // 最小电压 0.001
        addToBuff(&a[6], swapBytes((quint16)(m_pBattStack->fSglMinVolInStack*1000)));
        // 发送
        canSendFrame(0x1803F080, 8, a, true);
        str = QString(" 最大SOC=%1").arg(m_pBattStack->fBankSocMax);
        str += QString(" 最小SOC=%1").arg(m_pBattStack->fBankSocMin);                            
        str += QString(" 最大电压=%1").arg(m_pBattStack->fSglMaxVolInStack);
        str += QString(" 最小电压=%1").arg(m_pBattStack->fSglMinVolInStack);
        KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
        msleep(dev.m_uDelayMs);    

        // 最大温度 0.1
        addToBuff(&a[0], swapBytes((quint16)((signed short)(m_pBattStack->fSglMaxTempInStack*10))));
        // 最小温度 0.1
        addToBuff(&a[2], swapBytes((quint16)((signed short)(m_pBattStack->fSglMinTempInStack*10))));
        // 最大允许充电功率 0.1
        addToBuff(&a[4], swapBytes((quint16)(m_pBattStack->fStackAllowMaxChargePower*10)));
        // 最大允许放电功率 0.1
        addToBuff(&a[6], swapBytes((quint16)(m_pBattStack->fStackAllowMaxDischargePower*10)));
        // 发送
        canSendFrame(0x1804F080, 8, a, true); 
        str = QString(" 最大温度=%1").arg(m_pBattStack->fSglMaxTempInStack);
        str += QString(" 最小温度=%1").arg(m_pBattStack->fSglMinTempInStack);                            
        str += QString(" 最大允许充电功率=%1").arg(m_pBattStack->fStackAllowMaxChargePower);
        str += QString(" 最大允许放电功率=%1").arg(m_pBattStack->fStackAllowMaxDischargePower);
        KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
        msleep(dev.m_uDelayMs);  
    }
    else
    {
        for (int i=0; i<m_pBattStack->usInstallBankNum; i++)
        {
            CBattBank *pBattBank = m_pRTDB->getBank(i);
            // 堆状态
            addToBuff(&a[0], swapBytes(pBattBank->usBankState));
            // 最大允许充电电流 0.1
            addToBuff(&a[2], swapBytes((quint16)(pBattBank->fBankAllowMaxChargeCurrent*10)));
            // 最大允许放电电流 0.1
            addToBuff(&a[4], swapBytes((quint16)(pBattBank->fBankAllowMaxDischargeCurrent*10)));
            // SOC 0.1
            addToBuff(&a[6], swapBytes((quint16)(pBattBank->fBankSoc*10)));
            // 发送
            canSendFrame((0x1801F080 + i), 8, a, true);   
            QString str = QString(" 组%1 组状态=%2").arg(i+1).arg(pBattBank->usBankState,0,16).toUpper();
            str += QString(" 最大允许充电电流=%1").arg(pBattBank->fBankAllowMaxChargeCurrent);                            
            str += QString(" 最大允许放电电流=%1").arg(pBattBank->fBankAllowMaxDischargeCurrent);
            str += QString(" SOC=%1").arg(pBattBank->fBankSoc);
            KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
            msleep(dev.m_uDelayMs);
    
            // 可充电量 0.1
            addToBuff(&a[0], swapBytes((quint16)(pBattBank->fBankChargeEQ*10)));
            // 可放电量 0.1
            addToBuff(&a[2], swapBytes((quint16)(pBattBank->fBankDischargeEQ*10)));
            // 总电压 0.1
            addToBuff(&a[4], swapBytes((quint16)(pBattBank->fBankVol*10)));
            // 总电流 0.1
            addToBuff(&a[6], swapBytes((quint16)((signed short)(-pBattBank->fBankCur*10))));
            // 发送
            canSendFrame((0x1802F080 + i), 8, a, true);  
            str = QString(" 组%1 可充电量=%2").arg(i+1).arg(pBattBank->fBankChargeEQ);
            str += QString(" 可放电量=%1").arg(pBattBank->fBankDischargeEQ);                            
            str += QString(" 总电压=%1").arg(pBattBank->fBankVol);
            str += QString(" 总电流=%1").arg(pBattBank->fBankCur);
            KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
            msleep(dev.m_uDelayMs);
    
            // 最大SOC 0.1
            addToBuff(&a[0], swapBytes((quint16)(pBattBank->fSglMaxSoc*10)));
            // 最小SOC 0.1
            addToBuff(&a[2], swapBytes((quint16)(pBattBank->fSglMinSoc*10)));
            // 最大电压 0.001
            addToBuff(&a[4], swapBytes((quint16)(pBattBank->fSglMaxVol*1000)));
            // 最小电压 0.001
            addToBuff(&a[6], swapBytes((quint16)(pBattBank->fSglMinVol*1000)));
            // 发送
            canSendFrame((0x1803F080 + i), 8, a, true);  
            str = QString(" 组%1 最大SOC=%2").arg(i+1).arg(pBattBank->fSglMaxSoc);
            str += QString(" 最小SOC=%1").arg(pBattBank->fSglMinSoc);                            
            str += QString(" 最大电压=%1").arg(pBattBank->fSglMaxVol);
            str += QString(" 最小电压=%1").arg(pBattBank->fSglMinVol);
            KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
            msleep(dev.m_uDelayMs);    
    
            // 最大温度 0.1
            addToBuff(&a[0], swapBytes((quint16)((signed short)(pBattBank->fSglMaxTemp*10))));
            // 最小温度 0.1
            addToBuff(&a[2], swapBytes((quint16)((signed short)(pBattBank->fSglMinTemp*10))));
            // 最大允许充电功率 0.1
            addToBuff(&a[4], swapBytes((quint16)(pBattBank->fBankAllowMaxChargePower*10)));
            // 最大允许放电功率 0.1
            addToBuff(&a[6], swapBytes((quint16)(pBattBank->fBankAllowMaxDischargePower*10)));
            // 发送
            canSendFrame((0x1804F080 + i), 8, a, true);   
            str = QString(" 组%1 最大温度=%2").arg(i+1).arg(pBattBank->fSglMaxTemp);
            str += QString(" 最小温度=%1").arg(pBattBank->fSglMinTemp);                            
            str += QString(" 最大允许充电功率=%1").arg(pBattBank->fBankAllowMaxChargePower);
            str += QString(" 最大允许放电功率=%1").arg(pBattBank->fBankAllowMaxDischargePower);
            KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
            msleep(dev.m_uDelayMs);  
        }
    }
}

void CanThread::funcBms3020(devData &dev, int index) //【团标】【中国化学与物理电源行业协会团体标准公告】
{
    dev.m_uCommState = 0;
    if (m_ReInit.secsTo(QDateTime::currentDateTime()) >= 5)
    {
        m_ReInit = QDateTime::currentDateTime();
        m_bOpen = canInit();
        msleep(200);
    }     

    // 电压 U16 0.1V
    addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fStackVol*10)));
    // 电流 S16 0.1A
    addToBuff(&a[2], swapBytes((quint16)((signed short)(-m_pBattStack->fStackCur*10))));
    // SOC U16 0.1%
    addToBuff(&a[4], swapBytes((quint16)(m_pBattStack->fStackSoc*10)));
    // SOH U16 0.1%
    addToBuff(&a[6], swapBytes((quint16)(m_pBattStack->fStackSoh*10)));
    // 发送
    canSendFrame((0x18E10001+dev.m_uAddress*256), 8, a, true); 
    QString str = QString(" 电压=%1").arg(m_pBattStack->fStackVol);
    str += QString(" 电流=%1").arg(m_pBattStack->fStackCur);                            
    str += QString(" SOC=%1").arg(m_pBattStack->fStackSoc);
    str += QString(" SOH=%1").arg(m_pBattStack->fStackSoh);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);

    // 充电电流限制 U16 0.1A
    addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fStackAllowMaxChargeCurrent*10)));
    // 放电电流限制 U16 0.1A
    addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fStackAllowMaxDischargeCurrent*10)));
    // 充电电压限制 U16 0.1V
    addToBuff(&a[4], swapBytes((quint16)(((SAlarmParam *)&m_pRTDB->getBankAlarm(0)->param)->fBankVolUpLimitProt*10)));
    // 放电电压限制 U16 0.1V
    addToBuff(&a[6], swapBytes((quint16)(((SAlarmParam *)&m_pRTDB->getBankAlarm(0)->param)->fBankVolDownLimitProt*10)));
    // 发送
    canSendFrame((0x18E20001+dev.m_uAddress*256), 8, a, true);                      
    str = QString(" 充电电流限制=%1").arg(m_pBattStack->fStackAllowMaxChargeCurrent);
    str += QString(" 放电电流限制=%1").arg(m_pBattStack->fStackAllowMaxDischargeCurrent);
    str += QString(" 充电电压限制=%1").arg(((SAlarmParam *)&m_pRTDB->getBankAlarm(0)->param)->fBankVolUpLimitProt);
    str += QString(" 放电电压限制=%1").arg(((SAlarmParam *)&m_pRTDB->getBankAlarm(0)->param)->fBankVolDownLimitProt);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);

    // 充电可用电量 0.1 KWh
    addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fStackChargeEQ*10)));
    // 放电可用电量 0.1 KWh
    addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fStackDischargeEQ*10)));
    // BMS状态字
    temp16 = 0;
    if (m_pBattStack->usStackState == 0xAAAA) temp16 |= 6<<4;      // 故障
    else if (m_pBattStack->usStackState == 0x5555) temp16 |= 5<<4; // 待机
    else if (m_pBattStack->usStackState == 0x1111) temp16 |= 2<<4; // 禁充
    else if (m_pBattStack->usStackState == 0x2222) temp16 |= 3<<4; // 禁放
    temp16 |= 1<<4;                                                // 待机
    temp16 |= dev.m_uRev[0]<<12;
    if (++dev.m_uRev[0] > 15) dev.m_uRev[0] = 0;
    addToBuff(&a[4], swapBytes(temp16));
    // SOP 0.1 KW
    addToBuff(&a[6], swapBytes((quint16)((signed short)(m_pBattStack->fStackPower*10))));
    // 发送
    canSendFrame((0x18E30001+dev.m_uAddress*256), 8, a, true);                             
    str = QString(" 充电可用电量=%1").arg(m_pBattStack->fStackChargeEQ);
    str += QString(" 放电可用电量=%1").arg(m_pBattStack->fStackDischargeEQ);
    str += QString(" BMS状态字=%1").arg(temp16,0,16).toUpper();
    str += QString(" SOP=%1").arg(m_pBattStack->fStackPower);        
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);

    // 最高单体电压 U16 0.001V
    addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fSglMaxVolInStack*1000)));
    // 最低单体电压 U16 0.001V
    addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fSglMinVolInStack*1000)));
    // 最高单体温度 S16 0.1℃
    addToBuff(&a[4], swapBytes((quint16)((signed short)(m_pBattStack->fSglMaxTempInStack*10))));
    // 最低单体温度 S16 0.1℃
    addToBuff(&a[6], swapBytes((quint16)((signed short)(m_pBattStack->fSglMinTempInStack*10))));
    // 发送
    canSendFrame((0x18E40001+dev.m_uAddress*256), 8, a, true);                        
    str = QString(" 最高单体电压=%1").arg(m_pBattStack->fSglMaxVolInStack);
    str += QString(" 最低单体电压=%1").arg(m_pBattStack->fSglMinVolInStack);
    str += QString(" 最高单体温度=%1").arg(m_pBattStack->fSglMaxTempInStack);
    str += QString(" 最低单体温度=%1").arg(m_pBattStack->fSglMinTempInStack);        
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);
}

void CanThread::funcBms3100(devData &dev, int index) //【索英】【储能变流器与电池监控系统通信协议V1.0】
{
    dev.m_uCommState = 0;
    if (m_ReInit.secsTo(QDateTime::currentDateTime()) >= 5)
    {
        m_ReInit = QDateTime::currentDateTime();
        m_bOpen = canInit();
        msleep(200);
    }    

    // 运行状态
    if (m_pBattStack->usStackState == 0xAAAA) temp16 = 5;
    else if (m_pBattStack->usStackState == 0x5555) temp16 = 4;
    else if (m_pBattStack->usStackState == 0x2222) temp16 = 3;
    else if (m_pBattStack->usStackState == 0x1111) temp16 = 2;
    else temp16 = 1;
    a[0] = (quint8)temp16;
    // SOH
    a[1] = (quint8)m_pBattStack->fStackSoh;
    // SOC
    a[2] = (quint8)m_pBattStack->fStackSoc;
    // 总电压
    addToBuff(&a[3], swapBytes((quint16)(m_pBattStack->fStackVol*10)));
    // 总电流
    addToBuff(&a[5], swapBytes((quint16)(m_pBattStack->fStackCur + 20000)));
    // 预留
    a[7] = 0xFF;
    // 发送
    canSendFrame(0x0C33CC33, 8, a, true); 
    QString str = QString(" 堆状态=%1").arg(m_pBattStack->usStackState,0,16).toUpper();
    str += QString(" SOH=%1").arg(m_pBattStack->fStackSoh);
    str += QString(" SOC=%1").arg(m_pBattStack->fStackSoc);
    str += QString(" 总电压=%1").arg(m_pBattStack->fStackVol);
    str += QString(" 总电流=%1").arg(m_pBattStack->fStackCur);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);

    // 最大允许充电功率
    addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fStackAllowMaxChargePower*10)));
    // 最大允许放电功率
    addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fStackAllowMaxDischargePower*10)));
    // 最大允许充电电流
    addToBuff(&a[4], swapBytes((quint16)(m_pBattStack->fStackAllowMaxChargeCurrent*10)));
    // 最大允许放电电流
    addToBuff(&a[6], swapBytes((quint16)(m_pBattStack->fStackAllowMaxDischargeCurrent*10)));
    // 发送
    canSendFrame(0x0C33CC34, 8, a, true); 
    str = QString(" 最大允许充电功率=%1").arg(m_pBattStack->fStackAllowMaxChargePower);
    str += QString(" 最大允许放电功率=%1").arg(m_pBattStack->fStackAllowMaxDischargePower);
    str += QString(" 最大允许充电电流=%1").arg(m_pBattStack->fStackAllowMaxChargeCurrent);
    str += QString(" 最大允许放电电流=%1").arg(m_pBattStack->fStackAllowMaxDischargeCurrent);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);

    // 最高单体温度 偏移50
    a[0] = (quint8)(m_pBattStack->fSglMaxTempInStack + 50);
    // 最低单体温度 偏移50
    a[1] = (quint8)(m_pBattStack->fSglMinTempInStack + 50);    
    // 最高单体电压 mV
    addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fSglMaxVolInStack*1000)));
    // 最低单体电压 mV
    addToBuff(&a[4], swapBytes((quint16)(m_pBattStack->fSglMinVolInStack*1000)));
    // 预留
    a[6] = 0xFF;
    a[7] = 0xFF;
    // 发送
    canSendFrame(0x0C33CC35, 8, a, true); 
    str = QString(" 最高单体温度=%1").arg(m_pBattStack->fSglMaxTempInStack);
    str += QString(" 最低单体温度=%1").arg(m_pBattStack->fSglMinTempInStack);
    str += QString(" 最高单体电压=%1").arg(m_pBattStack->fSglMaxVolInStack);
    str += QString(" 最低单体电压=%1").arg(m_pBattStack->fSglMinVolInStack);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);
}

void CanThread::funcBms3101(devData &dev, int index) //【索英】【储能变流器与电池监控系统通信协议V1.6】
{
    dev.m_uCommState = 0;
    if (m_ReInit.secsTo(QDateTime::currentDateTime()) >= 5)
    {
        m_ReInit = QDateTime::currentDateTime();
        m_bOpen = canInit();
        msleep(200);
    }    

    // 0 运行状态
    if (m_pBattStack->usStackState == 0xAAAA) temp16 = 5;
    else if (m_pBattStack->usStackState == 0x5555) temp16 = 4;
    else if (m_pBattStack->usStackState == 0x2222) temp16 = 3;
    else if (m_pBattStack->usStackState == 0x1111) temp16 = 2;
    else temp16 = 1;
    a[0] = (quint8)temp16;
    // 1 SOH
    a[1] = (quint8)m_pBattStack->fStackSoh;
    // 2 SOC
    a[2] = (quint8)m_pBattStack->fStackSoc;
    // 3~4 总电压
    addToBuff(&a[3], swapBytes((quint16)(m_pBattStack->fStackVol*10)));
    // 5~6 总电流
    addToBuff(&a[5], swapBytes((quint16)(m_pBattStack->fStackCur + 20000)));
    // 7 预留
    a[7] = 0xFF;
    // 发送
    canSendFrame(0x0C33CC33, 8, a, true); 
    QString str = QString(" 堆状态=%1").arg(m_pBattStack->usStackState,0,16).toUpper();
    str += QString(" SOH=%1").arg(m_pBattStack->fStackSoh);
    str += QString(" SOC=%1").arg(m_pBattStack->fStackSoc);
    str += QString(" 总电压=%1").arg(m_pBattStack->fStackVol);
    str += QString(" 总电流=%1").arg(m_pBattStack->fStackCur);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);

    // 最大允许充电功率
    addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fStackAllowMaxChargePower*10)));
    // 最大允许放电功率
    addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fStackAllowMaxDischargePower*10)));
    // 最高单体电压 mV
    addToBuff(&a[4], swapBytes((quint16)(m_pBattStack->fSglMaxVolInStack*1000)));
    // 最低单体电压 mV
    addToBuff(&a[6], swapBytes((quint16)(m_pBattStack->fSglMinVolInStack*1000)));
    // 发送
    canSendFrame(0x0C33CC34, 8, a, true); 
    str = QString(" 最大允许充电功率=%1").arg(m_pBattStack->fStackAllowMaxChargePower);
    str += QString(" 最大允许放电功率=%1").arg(m_pBattStack->fStackAllowMaxDischargePower);
    str += QString(" 最高单体电压=%1").arg(m_pBattStack->fSglMaxVolInStack);
    str += QString(" 最低单体电压=%1").arg(m_pBattStack->fSglMinVolInStack);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);

    // 最高单体温度 偏移50
    a[0] = (quint8)(m_pBattStack->fSglMaxTempInStack + 50);
    // 最低单体温度 偏移50
    a[1] = (quint8)(m_pBattStack->fSglMinTempInStack + 50);    
    // 系统极限高压值 0.1V
    addToBuff(&a[2], swapBytes((quint16)(((SAlarmParam *)&m_pRTDB->getBankAlarm(0)->param)->fBankVolUpLimitProt*10)));
    // 系统极限低压值 0.1V
    addToBuff(&a[4], swapBytes((quint16)(((SAlarmParam *)&m_pRTDB->getBankAlarm(0)->param)->fBankVolDownLimitProt*10)));
    // 预留
    a[6] = 0xFF;
    a[7] = 0xFF;
    // 发送
    canSendFrame(0x0C33CC35, 8, a, true); 
    str = QString(" 最高单体温度=%1").arg(m_pBattStack->fSglMaxTempInStack);
    str += QString(" 最低单体温度=%1").arg(m_pBattStack->fSglMinTempInStack);
    str += QString(" 系统极限高压值=%1").arg(((SAlarmParam *)&m_pRTDB->getBankAlarm(0)->param)->fBankVolUpLimitProt);
    str += QString(" 系统极限低压值=%1").arg(((SAlarmParam *)&m_pRTDB->getBankAlarm(0)->param)->fBankVolDownLimitProt);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);
}

void CanThread::funcBms3150(devData &dev, int index) //【禾望】【PCS与BMS的CAN通信规约】
{
    dev.m_uCommState = 0;
    if (m_ReInit.secsTo(QDateTime::currentDateTime()) >= 5)
    {
        m_ReInit = QDateTime::currentDateTime();
        m_bOpen = canInit();
        msleep(200);
    }    

    // 最大允许充电电流
    addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fStackAllowMaxChargeCurrent*10)));
    // 最大允许放电电流
    addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fStackAllowMaxDischargeCurrent*10)));
    // 总电压
    addToBuff(&a[4], swapBytes((quint16)(m_pBattStack->fStackVol*10)));
    // 总电流(正放负充)
    addToBuff(&a[6], swapBytes((quint16)((-m_pBattStack->fStackCur*10) + 32000)));
    // 发送
    canSendFrame(0x18102701, 8, a, true); 
    QString str = QString(" 最大允许充电电流=%1").arg(m_pBattStack->fStackAllowMaxChargeCurrent);
    str += QString(" 最大允许放电电流=%1").arg(m_pBattStack->fStackAllowMaxDischargeCurrent);
    str += QString(" 总电压=%1").arg(m_pBattStack->fStackVol);
    str += QString(" 总电流=%1").arg(m_pBattStack->fStackCur);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);

    memset(a, 0, 8);
    // 最大允许充电功率
    addToBuff(&a[0], swapBytes((quint16)(m_pBattStack->fStackAllowMaxChargePower*10)));
    // 最大允许放电功率
    addToBuff(&a[2], swapBytes((quint16)(m_pBattStack->fStackAllowMaxDischargePower*10)));
    // SOC
    a[6] = (quint8)m_pBattStack->fStackSoc;
    // 发送
    canSendFrame(0x18112701, 8, a, true); 
    str = QString(" 最大允许充电功率=%1").arg(m_pBattStack->fStackAllowMaxChargePower);
    str += QString(" 最大允许放电功率=%1").arg(m_pBattStack->fStackAllowMaxDischargePower);
    str += QString(" SOC=%1").arg(m_pBattStack->fStackSoc);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);

    memset(a, 0, 8);
    // 电池状态位
    // bit0 允许充电 0禁止 1允许
    // bit1 允许放电 0禁止 1允许
    // bit2 严重故障 0正常 1故障
    // bit4 放空 0未放空 1放空
    // bit5 充满 0未充满 1充满
    // bit6 主接触器 0断开 1闭合
    temp16 = 0;
    switch (m_pBattStack->usStackState)
    {
        // 故障
        case 0xAAAA: temp16 = 0x04; break;
        // 告警
        case 0x5555: temp16 = 0x00; break;
        // 禁充
        case 0x1111: temp16 = 0x22; break;
        // 禁放
        case 0x2222: temp16 = 0x11; break;
        // 预警
        case 0xCCCC: temp16 = 0x03; break;
        // 正常
        case 0xBBBB: temp16 = 0x03; break;
        default: temp16 = 0x04; break;
    }
    if (m_pBattStack->usDI1) temp16 |= 1<<6;
    a[0] = (quint8)temp16;
    // 发送
    canSendFrame(0x18122701, 8, a, true); 
    str = QString(" 堆状态=%1").arg(m_pBattStack->usStackState,0,16).toUpper();
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);
}

void CanThread::funcBms3160(devData &dev, int index) //【协能】【储能PCS与BMS-CAN通信协议】
{
    dev.m_uCommState = 0;
    if (m_ReInit.secsTo(QDateTime::currentDateTime()) >= 5)
    {
        m_ReInit = QDateTime::currentDateTime();
        m_bOpen = canInit();
        msleep(200);
    }    
    // BMS序号
    a[0] = dev.m_uAddress;
    // 电池工作状态 11充满 22放空 55告警 AA故障 BB正常
    a[1] = (quint8)m_pBattStack->usStackState;
    // 最大允许充电电流
    addToBuff(&a[2], (quint16)(m_pBattStack->fStackAllowMaxChargeCurrent*10));
    // 最大允许放电电流
    addToBuff(&a[4], (quint16)(m_pBattStack->fStackAllowMaxDischargeCurrent*10));
    // 总电压
    addToBuff(&a[6], (quint16)(m_pBattStack->fStackVol*10));
    // 发送
    canSendFrame(0x000C0000, 8, a, true); 
    QString str = QString(" BMS序号=%1").arg(dev.m_uAddress);
    str += QString(" 电池堆状态=%1").arg(m_pBattStack->usStackState,0,16).toUpper();
    str += QString(" 最大允许充电电流=%1").arg(m_pBattStack->fStackAllowMaxChargeCurrent);
    str += QString(" 最大允许放电电流=%1").arg(m_pBattStack->fStackAllowMaxDischargeCurrent);
    str += QString(" 总电压=%1").arg(m_pBattStack->fStackVol);
    KG_LOG_INFO(QString("逆变器%1%2").arg(index+1).arg(str));
    msleep(dev.m_uDelayMs);
}

void CanThread::readThData(void)
{
    for (int index=0; index<m_thDevCount; index++)
    {
        devData &dev = m_thList[index];
        CThData *pThData = m_pRTDB->getThDev(index);
        QSettings set(DEV_PATH, QSettings::IniFormat);
        for (int i=0; i<99; i++) 
        {
            pThData->m_uRev[i] = set.value(QString("TH-%1/m_uRev[%2]").arg(index+1).arg(i), pThData->m_uRev[i]).toInt();
        }
        for (int i=0; i<100; i++) 
        {
            pThData->m_fRev[i] = set.value(QString("TH-%1/m_fRev[%2]").arg(index+1).arg(i), pThData->m_fRev[i]).toFloat();
        }   
        switch(dev.m_uFunc)
        {
            case 3010: funcTh3010(dev, pThData, index); break; //【镐喆】【HZT04A温度采集板使用说明书】
        }
        m_bOpen = !dev.m_uCommState;
        if (dev.m_uCommLastState != dev.m_uCommState)
        {
            if ((dev.m_Time.secsTo(QDateTime::currentDateTime()) >= dev.m_uCommTimeout) || (dev.m_uCommState == 0))
            {
                dev.m_Time = QDateTime::currentDateTime();
                dev.m_uCommLastState = dev.m_uCommState;
                pThData->m_uCommState = dev.m_uCommState;
                QString str = QString("连接温湿度%1 通信%2").arg(index+1).arg(dev.m_uCommState?"失败":"成功");
                KG_LOG_INFO(str);
                saveLogToBaDb(str);  
            }    
        }
        else
        {
            dev.m_Time = QDateTime::currentDateTime();
        }
    }    
}

void CanThread::funcTh3010(devData &dev, CThData *pThData, int index) //【镐喆】【HZT04A温度采集板使用说明书】
{
    dev.m_uCommState = 1;
    dev.m_uRev[0] = 0;
    while ((dev.m_uCommState == 1) && (((dev.m_uRev[0]++)&0x00FF) < 5))
    {
        memset(m_pRecv,0,sizeof(SCanMutiFrame)*100);
        int ret = m_can.readMultiFrame((uchar*)m_pRecv,100,1000);
        if (ret < 0) KG_LOG_INFO(QString("接收数据超时=%1").arg(ret));
        pCanMutiFrame = (SCanMutiFrame*)(m_pRecv+sizeof(SCanMutiFrame)*0);
        if (pCanMutiFrame)
        {
            if (pCanMutiFrame->can_id & 0x80000000U)
            {
                QString str = "收: ";
                str += QString("%1 ").arg(pCanMutiFrame->can_id & 0x1FFFFFFF,2,16);
                for(int j=0; j<pCanMutiFrame->can_dlc; j++)
                {
                    str += QString("%1 ").arg(pCanMutiFrame->data[j],2,16,(QChar)'0');
                }
                str = str.toUpper();
                KG_LOG_INFO(str);                    
                // 解析报文
                if ((pCanMutiFrame->can_id & 0x1FFFFFFF) == (0x18FFF400 + dev.m_uAddress))
                { 
                    switch (pCanMutiFrame->data[0]+pCanMutiFrame->data[1]*256)
                    {
                        case 0: 
                        {
                            dev.m_uRev[0] |= 0x0100;
                            pThData->m_fRev[0] = (signed short)(pCanMutiFrame->data[2]+pCanMutiFrame->data[3]*256);
                            pThData->m_fRev[1] = (signed short)(pCanMutiFrame->data[4]+pCanMutiFrame->data[5]*256);
                            pThData->m_fRev[2] = (signed short)(pCanMutiFrame->data[6]+pCanMutiFrame->data[7]*256);
                            QString str = QString(" 第1帧 温度01=%1").arg(pThData->m_fRev[0]);
                            str += QString(" 温度02=%1").arg(pThData->m_fRev[1]);
                            str += QString(" 温度03=%1").arg(pThData->m_fRev[2]);
                            KG_LOG_INFO(QString("温湿度%1%2").arg(index+1).arg(str));
                        }
                        break;
                        case 3:
                        {
                            dev.m_uRev[0] |= 0x0200;
                            pThData->m_fRev[3] = (signed short)(pCanMutiFrame->data[2]+pCanMutiFrame->data[3]*256);
                            pThData->m_fRev[4] = (signed short)(pCanMutiFrame->data[4]+pCanMutiFrame->data[5]*256);
                            pThData->m_fRev[5] = (signed short)(pCanMutiFrame->data[6]+pCanMutiFrame->data[7]*256);
                            QString str = QString(" 第2帧 温度04=%1").arg(pThData->m_fRev[3]);
                            str += QString(" 最高温度值=%1").arg(pThData->m_fRev[4]);
                            str += QString(" CO浓度值=%1").arg(pThData->m_fRev[5]);
                            KG_LOG_INFO(QString("温湿度%1%2").arg(index+1).arg(str));
                        }
                        break;
                        case 6:
                        {
                            dev.m_uRev[0] |= 0x0400;
                            pThData->m_fRev[6] = (signed short)(pCanMutiFrame->data[2]+pCanMutiFrame->data[3]*256);
                            pThData->m_fRev[7] = (signed short)(pCanMutiFrame->data[4]+pCanMutiFrame->data[5]*256);
                            pThData->m_uRev[0] = pCanMutiFrame->data[6]+pCanMutiFrame->data[7]*256;
                            QString str = QString(" 第3帧 板载温度值=%1").arg(pThData->m_fRev[6]);
                            str += QString(" 预留=%1").arg(pThData->m_fRev[7]);
                            str += QString(" 心跳值=%1").arg(pThData->m_uRev[0]);
                            KG_LOG_INFO(QString("温湿度%1%2").arg(index+1).arg(str));
                        }
                        break;
                    }
                    if ((dev.m_uRev[0]&0xFF00) == 0x0700)
                    {
                        dev.m_uCommState = 0;
                    }
                }
            }
        }
    }
    msleep(dev.m_uDelayMs);
    if (!pThData->m_uCommState)
    {
        // 室内温度 ℃
        pThData->m_fInsideTemp = pThData->m_fRev[4]; // 最高温度值
    }
}

void CanThread::readHkData(void)
{
    for (int index=0; index<m_hkDevCount; index++)
    {
        devData &dev = m_hkList[index];
        CEcData *pHkData = m_pRTDB->getEcDev(index);
        QSettings set(DEV_PATH, QSettings::IniFormat);
        for (int i=0; i<99; i++) 
        {
            pHkData->m_uRev[i] = set.value(QString("HK-%1/m_uRev[%2]").arg(index+1).arg(i), pHkData->m_uRev[i]).toInt();
        }
        for (int i=0; i<100; i++) 
        {
            pHkData->m_fRev[i] = set.value(QString("HK-%1/m_fRev[%2]").arg(index+1).arg(i), pHkData->m_fRev[i]).toFloat();
        }     
        switch(dev.m_uFunc)
        {
            case 3010: funcHk3010(dev, pHkData, index); break; //【奥威】【BP_ECU和BAMS通信协议V1.0】
        }
        m_bOpen = !dev.m_uCommState;
        if (dev.m_uCommLastState != dev.m_uCommState)
        {
            if ((dev.m_Time.secsTo(QDateTime::currentDateTime()) >= dev.m_uCommTimeout) || (dev.m_uCommState == 0))
            {
                dev.m_Time = QDateTime::currentDateTime();
                dev.m_uCommLastState = dev.m_uCommState;
                pHkData->m_uCommState = dev.m_uCommState;
                QString str = QString("连接环控%1 通信%2").arg(index+1).arg(dev.m_uCommState?"失败":"成功");
                KG_LOG_INFO(str);
                saveLogToBaDb(str);  
            }    
        }
        else
        {
            dev.m_Time = QDateTime::currentDateTime();
        }
    }    
}

void CanThread::funcHk3010(devData &dev, CEcData *pHkData, int index) //【奥威】【BP_ECU和BAMS通信协议V1.0】
{
    dev.m_uCommState = 1;
    dev.m_uRev[0] = 0;
    while ((dev.m_uCommState == 1) && ((dev.m_uRev[0]++) < 5))
    {
        memset(m_pRecv,0,sizeof(SCanMutiFrame)*100);
        int ret = m_can.readMultiFrame((uchar*)m_pRecv,100,1000);
        if (ret < 0) KG_LOG_INFO(QString("接收数据超时=%1").arg(ret));
        pCanMutiFrame = (SCanMutiFrame*)(m_pRecv+sizeof(SCanMutiFrame)*0);
        if (pCanMutiFrame)
        {
            if (pCanMutiFrame->can_id & 0x80000000U)
            {
                QString str = "收: ";
                str += QString("%1 ").arg(pCanMutiFrame->can_id & 0x1FFFFFFF,2,16);
                for(int j=0; j<pCanMutiFrame->can_dlc; j++)
                {
                    str += QString("%1 ").arg(pCanMutiFrame->data[j],2,16,(QChar)'0');
                }
                str = str.toUpper();
                KG_LOG_INFO(str);                    
                // 解析报文
                if ((pCanMutiFrame->can_id & 0x1FFFFFFF) == 0x10F8BABE)
                { 
                    dev.m_uCommState = 0;
                    // 告警状态位1
                    pHkData->m_uRev[0] = pCanMutiFrame->data[0];
                    // 告警状态位2
                    pHkData->m_uRev[1] = pCanMutiFrame->data[1];
                    // 液冷机组1-出水温度
                    pHkData->m_fRev[0] = (signed char)pCanMutiFrame->data[3] - 40;
                    // 液冷机组1-回水温度
                    pHkData->m_fRev[1] = (signed char)pCanMutiFrame->data[4] - 40;
                    // 液冷机组2-出水温度
                    pHkData->m_fRev[2] = (signed char)pCanMutiFrame->data[5] - 40;
                    // 液冷机组2-回水温度
                    pHkData->m_fRev[3] = (signed char)pCanMutiFrame->data[6] - 40;
                    // Life
                    pHkData->m_uRev[2] = pCanMutiFrame->data[7];
                    QString str = QString(" 告警状态位1=%1").arg(pHkData->m_uRev[0]);
                    str += QString(" 告警状态位2=%1").arg(pHkData->m_uRev[1]);
                    str += QString(" 液冷机组1-出水温度=%1").arg(pHkData->m_fRev[0]);
                    str += QString(" 液冷机组1-回水温度=%1").arg(pHkData->m_fRev[1]);
                    str += QString(" 液冷机组2-出水温度=%1").arg(pHkData->m_fRev[2]);
                    str += QString(" 液冷机组2-回水温度=%1").arg(pHkData->m_fRev[3]);
                    str += QString(" Life=%1").arg(pHkData->m_uRev[2]);
                    KG_LOG_INFO(QString("环控%1%2").arg(index+1).arg(str));
                }
            }
        }
    }
    msleep(dev.m_uDelayMs);
    if (!pHkData->m_uCommState)
    {
        // 无
    }
}

int CanThread::canInit(void)
{
    m_can.closeDevice();
    int ret = m_can.openDevice(m_sComName.toLatin1().data(), m_uComBaudRate * 1000);
    KG_LOG_INFO(QString("打开%1=%3").arg(m_sComName).arg(ret<0?"失败":"成功"));    
    return (ret<0?0:1);
}

void CanThread::canSendFrame(quint32 id, int len, char *a, bool isExtand)
{
    // 发送
    m_can.writeFrame(id,(uchar*)a, (isExtand?(len+100):len)); // +100表示扩展帧
    QString str = "发: ";
    str += QString("%1 ").arg(id,2,16);
    for(int j=0; j<len; j++)
    {
        str += QString("%1 ").arg(a[j],2,16,(QChar)'0');
    }
    str = str.toUpper();
    KG_LOG_INFO(str);    
}

void CanThread::devConfig(void)
{
    QSettings set(DEV_PATH, QSettings::IniFormat);
    m_isOutputLog = set.value("Log/IsOutputLog", 0).toInt();
    if (m_isOutputLog == 1)
    {
        QDir dir;
        dir.mkdir("../log");
        QString   logFileName = QString(m_strLog) ;
        QFile file(logFileName);
        file.remove();
        m_logFile.createlogfile(logFileName);
    }
    m_sComName = set.value(QString("CAN-%1/ComName").arg(m_bcIndex), "can1").toString();
    m_uComBaudRate = set.value(QString("CAN-%1/BaudRate").arg(m_bcIndex), 500).toUInt();

    m_bmsDevCount = set.value(QString("CAN-%1/BmsDevCount").arg(m_bcIndex), 0).toUInt();
    for (int i=0; i<m_bmsDevCount; i++) 
    {
        devData dev;
        dev.m_uAddress = set.value(QString("BMS-%1/Address").arg(i+1), 0).toUInt();
        dev.m_uFunc = set.value(QString("BMS-%1/Function").arg(i+1), 0).toInt();        
        dev.m_uDelayMs = set.value(QString("BMS-%1/DelayMs").arg(i+1),500).toUInt();
        dev.m_uCommTimeout = set.value(QString("BMS-%1/CommTimeout").arg(i+1),10).toUInt();       
        dev.m_uCommState = 1;
        dev.m_uCommLastState = 5;        
        dev.m_Time = QDateTime::currentDateTime();
        // #3020 团标: m_uRev[0] 心跳
        dev.m_uRev[0] = 0; 
        m_bmsList.append(dev);
        KG_LOG_INFO(QString("BMS%1 协议号=%2").arg(i+1).arg(dev.m_uFunc));
    }      

    m_thDevCount = set.value(QString("CAN-%1/ThDevCount").arg(m_bcIndex), 0).toUInt();
    for (int i=0; i<m_thDevCount; i++) 
    {
        devData dev;
        dev.m_uAddress = set.value(QString("TH-%1/Address").arg(i+1), 0).toUInt();
        dev.m_uFunc = set.value(QString("TH-%1/Function").arg(i+1), 0).toInt();   
        dev.m_uDelayMs = set.value(QString("TH-%1/DelayMs").arg(i+1),500).toUInt();
        dev.m_uCommTimeout = set.value(QString("TH-%1/CommTimeout").arg(i+1),10).toUInt();       
        dev.m_uCommState = 1;
        dev.m_uCommLastState = 5;        
        dev.m_Time = QDateTime::currentDateTime(); 
        // #3010 m_uRev[0] 接收帧计数 
        dev.m_uRev[0] = 0;
        dev.m_uRev[1] = 0;
        // 数据置无效值
        CThData *pThData = m_pRTDB->getThDev(i);   
        pThData->m_uCommState = 0xFFFF;
        for (int j=0; j<99; j++) 
        {
            pThData->m_uRev[j] = 0xFFFF;		
        }
        for (int j=0; j<100; j++) 
        {
            pThData->m_fRev[j] = FLT_MAX;	
        }  
        m_thList.append(dev);
        KG_LOG_INFO(QString("温湿度%1 协议号=%2").arg(i+1).arg(dev.m_uFunc));
    }   

    m_hkDevCount = set.value(QString("CAN-%1/HkDevCount").arg(m_bcIndex), 0).toUInt();
    for (int i=0; i<m_hkDevCount; i++) 
    {
        devData dev;
        dev.m_uAddress = set.value(QString("HK-%1/Address").arg(i+1), 0).toUInt();
        dev.m_uFunc = set.value(QString("HK-%1/Function").arg(i+1), 0).toInt();        
        dev.m_uDelayMs = set.value(QString("HK-%1/DelayMs").arg(i+1),500).toUInt();
        dev.m_uCommTimeout = set.value(QString("HK-%1/CommTimeout").arg(i+1),10).toUInt();       
        dev.m_uCommState = 1;
        dev.m_uCommLastState = 5;        
        dev.m_Time = QDateTime::currentDateTime();
        // #3010 m_uRev[0] 接收帧计数
        dev.m_uRev[0] = 0;
        // 数据置无效值
        CEcData *pHkData = m_pRTDB->getEcDev(i);   
        pHkData->m_uCommState = 0xFFFF;
        for (int j=0; j<99; j++) 
        {
            pHkData->m_uRev[j] = 0xFFFF;		
        }
        for (int j=0; j<100; j++) 
        {
            pHkData->m_fRev[j] = FLT_MAX;	
        }     
        m_hkList.append(dev);
        KG_LOG_INFO(QString("环控%1 协议号=%2").arg(i+1).arg(dev.m_uFunc));
    } 
}

void CanThread::writeKgLogfile(QString strInfo,bool bSaveToFile)
{
    QByteArray dt = strInfo.toLocal8Bit();
    char *p = dt.data();
    printf(p);
    printf("\n");
    if (1 != m_isOutputLog)//|| !bSaveToFile
    {
        return;
    }
    if (!bSaveToFile)
    {
        return;
    }
    int fileSize = m_logFile.fileSize();
    if (fileSize >= KG_MAX_LOG_SIZE)
    {
        printf("log size:%d, too large to delete\n", fileSize);
        m_logFile.close();
        QString   logFileName = QString(m_strLog);
        QFile file(logFileName);
        file.remove();
        m_logFile.createlogfile(logFileName);
    }    
    m_logFile.writelogfile(strInfo);
}
